//
// Created by Lenovo on 2021/12/23.
//

#include "Sequence_CirculationQueue.h"


Status InitQueue(SqQueue *Q){

    Q->base=(QElemType*) malloc(sizeof(QElemType)*MAX_QSIZE);
    if(!Q->base) exit(OVERFLOW);    //储存分配失败
    Q->front=Q->rear=0;
    return OK;
}  //构造一个空队


Status DestroyQueue(SqQueue *Q){
    if(Q==NULL) return ERROR;
    free(Q->base);
    free(Q);
    Q=NULL;
    return OK;
}    //销毁队Q，Q不再存在


Status ClearQueue(SqQueue *Q){
    if(Q==NULL||Q->base==NULL) return ERROR;
    Q->rear=Q->front;
    return OK;
}  //把Q置为空队


Status QueueEmpty(SqQueue Q){
    if(Q.base==NULL)    return ERROR;
    if(Q.front==Q.rear)   return TRUE;
    else    return FALSE;
}   //若Q为空队返回TRUE，否则返回FALSE


int QueueLength(SqQueue Q){
    if(Q.base==NULL)    return ERROR;
    return (Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
}     //返回Q的元素个数，即队的长度


QElemType* GetHead(SqQueue Q){
    QElemType *re;
    if(Q.rear==Q.front)   return NULL;
    re=&Q.base[Q.front];
    return re;
}  //若队不空，则返回队顶元素，否则返回NULL


Status EnQueue(SqQueue *Q,QElemType e){
    if((Q->rear+1)%MAX_QSIZE==Q->front){   //队满
        return ERROR;
    }
    Q->base[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAX_QSIZE;

    return OK;
}    //插入元素e为新的队尾元素


QElemType DeQueue(SqQueue *Q){
    QElemType re;
    //若队不空，则删除队头元素，返回其值，否则返回ERROR
    if(Q->front==Q->rear) exit(ERROR);
    re=Q->base[Q->front];
    Q->front=(Q->front+1)%MAX_QSIZE;
    return re;
}  //若队不空，则删除队头元素并返回，否则返回NULL


Status QueueTraverse(SqQueue Q,Status (*visit)(QElemType)){
    if(Q.base==NULL)    return ERROR;
    int tmp=Q.front;
    for (int i = tmp; tmp!=Q.rear ; ++i) {
        visit(Q.base[tmp]);
        tmp=(tmp+1)%MAX_QSIZE;
    }
    return OK;
}     //从队头到队尾一次对栈中每个元素调用函数visit（），一旦visit（）失败，则返回ERROR